import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import storageAPI from '@/api/storage'

export const useAuthStore = defineStore('auth', () => {
  // 状态
  const user = ref(null)
  const token = ref(null)
  const isLoginModalVisible = ref(false)
  const isLoading = ref(false)
  const loginMode = ref('password')
  
  // 计算属性
  const isAuthenticated = computed(() => !!token.value && !!user.value)
  
  // 方法
  const setUser = async (userData) => {
    user.value = userData
    if (userData) {
      await storageAPI.setItem('auth_user', userData)
    } else {
      await storageAPI.removeItem('auth_user')
    }
  }
  
  const setToken = async (tokenValue) => {
    token.value = tokenValue
    if (tokenValue) {
      await storageAPI.setItem('auth_token', tokenValue)
    } else {
      await storageAPI.removeItem('auth_token')
    }
  }
  
  const getToken = () => {
    return token.value
  }
  
  const setLoading = (loading) => {
    isLoading.value = loading
  }
  
  const showLoginModal = () => {
    isLoginModalVisible.value = true
  }
  
  const hideLoginModal = () => {
    isLoginModalVisible.value = false
  }
  
  const setLoginMode = (mode) => {
    loginMode.value = mode
  }
  
  const logout = async () => {
    await setUser(null)
    await setToken(null)
    
    // 清空本地数据
    const { useTodoStore } = await import('./todoStore.js')
    const todoStore = useTodoStore()
    await todoStore.clearAllData()
    
    // 显示登录弹窗
    showLoginModal()
  }
  
  // 登录成功后的处理
  const handleLoginSuccess = async (tokenValue, userData) => {
    await setToken(tokenValue)
    await setUser(userData)
    hideLoginModal()
    
    // 登录成功后立即同步数据
    try {
      const { useSyncStore } = await import('./syncStore.js')
      const syncStore = useSyncStore()
      await syncStore.syncNow()
      console.log('登录成功，数据同步完成')
    } catch (error) {
      console.warn('登录后同步数据失败:', error)
    }
  }
  
  const initAuth = async () => {
    console.log('🔍 开始初始化认证状态...')
    
    // 从 storageAPI 获取已保存的 token 和用户信息
    const savedToken = await storageAPI.getItem('auth_token')
    const savedUser = await storageAPI.getItem('auth_user')
    
    console.log('📦 本地存储检查:', {
      hasToken: !!savedToken,
      hasUser: !!savedUser,
      tokenPreview: savedToken ? `${savedToken.substring(0, 20)}...` : null
    })
    
    if (savedToken && savedUser) {
      token.value = savedToken
      user.value = savedUser
      console.log('🚀 发现本地token，开始验证...')
      
      // 验证 token 有效性并获取最新用户信息
      try {
        await verifyToken()
        console.log('✅ Token验证成功')
        // 验证成功，不显示登录弹窗
      } catch (error) {
        console.error('❌ Token验证失败:', error)
        
        // 清空本地数据
        const { useTodoStore } = await import('./todoStore.js')
        const todoStore = useTodoStore()
        await todoStore.clearAllData()
        
        // 清空认证信息
        await setUser(null)
        await setToken(null)
        
        // 显示登录弹窗
        showLoginModal()
      }
    } else {
      console.log('⚠️ 没有完整的认证信息，显示登录弹窗')
      // 没有完整的认证信息时强制显示登录弹窗
      showLoginModal()
    }
  }
  
  const verifyToken = async () => {
    if (!token.value) {
      throw new Error('No token available')
    }
    
    console.log('🌐 发送token验证请求到:', `${import.meta.env.VITE_GO_URL}/api/v1/auth/me`)
    
    try {
      const api = (await import('@/api/index.js')).default
      const response = await api.get('/auth/me')
      
      console.log('📡 收到验证响应:', response.status, response.data)
      
      if (response.data.success) {
        setUser(response.data.data)
        return response.data.data
      } else {
        throw new Error('Token验证失败')
      }
    } catch (error) {
      console.error('🚫 验证请求失败:', {
        message: error.message,
        status: error.response?.status,
        data: error.response?.data,
        url: error.config?.url
      })
      throw error
    }
  }
  
  const checkTaskLimit = (currentTaskCount) => {
    // 如果用户已登录，没有限制
    if (isAuthenticated.value) {
      return { needLogin: false, limit: null }
    }
    
    // 取消游客模式，必须登录才能使用
    return { 
      needLogin: true, 
      limit: 0,
      message: '请先登录后再使用任务功能。'
    }
  }
  
  return {
    // 状态
    user,
    token,
    isLoginModalVisible,
    isLoading,
    loginMode,
    
    // 计算属性
    isAuthenticated,
    
    // 方法
    setUser,
    setToken,
    getToken,
    setLoading,
    showLoginModal,
    hideLoginModal,
    setLoginMode,
    logout,
    handleLoginSuccess,
    initAuth,
    verifyToken,
    checkTaskLimit
  }
})

// 默认导出
export default useAuthStore